home *** CD-ROM | disk | FTP | other *** search
- /******************************************************************************
- ** **
- ** Module: PackBytes.c **
- ** **
- ** **
- ** Purpose: **
- ** **
- ** **
- ** **
- ** Copyright (C) 1988-1990 Apple Computer, Inc. All rights reserved. **
- ** **
- ** **
- *****************************************************************************/
-
- #include "PackBytes.h"
-
- #if defined(applec) || defined(THINK_C) || defined(powerc) || defined(__MWERKS__)
- #include <ToolUtils.h>
- #else /* !(defined(macintosh) || defined(THINK_C)) */
-
- #ifdef __cplusplus
- extern "C" {
- #endif /* __cplusplus */
-
-
- /*===========================================================================*\
- *
- * Routine: PackBits()
- *
- * Comments:
- *
- \*===========================================================================*/
-
- void PackBits(
- char **srcPtr,
- char **dstPtr,
- short srcBytes)
- {
- register char *s, *d;
- char *countLoc;
- register short count, lastByte;
- short tinycount;
-
- s = *srcPtr;
- d = *dstPtr;
-
- count = 0;
- lastByte = 256; /* an impossible value */
-
- while (srcBytes) {
- /* Look for runs */
- while (srcBytes && ((*s == lastByte) || lastByte == 256)) { /* Runs */
- srcBytes--;
- lastByte = *s++;
- if (++count == 128)
- /* 129 is max, but Mac toolbox can't. -128 = 0x80 */
- break;
- }
- if (count >= 3) { /* Flush run and reset machine */
- *d++ = -(count - 1);
- *d++ = lastByte;
- count = 0;
- lastByte = 256;
- continue;
- }
-
- /* Look for vectors */
- countLoc = d++; /* Save location for back-fitting the count */
- for (tinycount = count; tinycount; tinycount--)
- *d++ = lastByte; /* Copy any tiny runs */
-
- while (srcBytes) {
- if ((s[0] == lastByte) && (s[1] == lastByte) && (srcBytes >= 2)) {
- d--; /* remove the last byte, save for runlength */
- s--;
- if (--count == 0)
- d--; /* Remove placeholder at countLoc */
- srcBytes++;
- break;
- }
- srcBytes--;
- lastByte = *d++ = *s++;
- if (++count == 128) /* 127 = 0xFF */
- break;
- }
- if (count) {
- *countLoc = count - 1; /* Store vector count */
- count = 0;
- }
- lastByte = 256;
- }
-
- *srcPtr = s;
- *dstPtr = d;
- }
-
-
- /*===========================================================================*\
- *
- * Routine: UnpackBits()
- *
- * Comments:
- *
- \*===========================================================================*/
-
- void UnpackBits(
- char **srcPtr,
- char **dstPtr,
- register short dstBytes)
- {
- register char *s, *d;
- register short count, val;
-
- s = *srcPtr;
- d = *dstPtr;
-
- while (dstBytes) {
- if (*s & 0x80) { /* a run */
- if ((count = -(*s++ | ~0xFF)) >= dstBytes) /* run longer than requested */
- count = dstBytes-1; /* zero-based count */
- dstBytes -= count + 1;
- val = *s++;
- do { *d++ = val; } while (count--);
- }
- else { /* a vector */
- if ((count = *s++) >= dstBytes) /* vector longer than requested */
- count = dstBytes-1; /* zero-based count */
- dstBytes -= count + 1;
- do { *d++ = *s++; } while (count--);
- }
- }
-
- *srcPtr = (char *)s;
- *dstPtr = (char *)d;
- }
-
- #ifdef __cplusplus
- } /* end extern "C" */
- #endif /* __cplusplus */
-
- #endif /* macintosh */
-
-
- #ifdef __cplusplus
- extern "C" {
- #endif /* __cplusplus */
-
-
- #define RUNLENGTH 32767
- /*===========================================================================*\
- *
- * Routine: PackBytes()
- *
- * Comments:
- *
- \*===========================================================================*/
-
- unsigned long PackBytes(
- char *from,
- char *to,
- unsigned long nBytes)
- {
- char *src = from, *dst = to;
- long count;
-
- for (count = (long)nBytes; count > 0; count -= RUNLENGTH)
- PackBits(&src, &dst, (count > RUNLENGTH) ? RUNLENGTH : (short)count);
- return (dst - to);
- }
-
-
- /*===========================================================================*\
- *
- * Routine: UnpackBytes()
- *
- * Comments:
- *
- \*===========================================================================*/
-
- void UnpackBytes(
- char *src,
- char *dst,
- unsigned long nBytes)
- {
- long count;
-
- for (count = (long)nBytes; count > 0; count -= (long)RUNLENGTH)
- UnpackBits(&src, &dst, (count > RUNLENGTH) ? RUNLENGTH : (short)count);
- }
-
-
- #ifdef __cplusplus
- } /* end extern "C" */
- #endif /* __cplusplus */
-